
package table.calcadosFiltrados;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.MaskFormatter;
import model.CalcadosFiltradosMODEL;
import model.CorMODEL;
import model.NumeracaoMODEL;
import table.Pair;
import table.TooltipCellRender;

/**
 *
 * @author Welisson
 */
public class CalcadosFiltradosTable extends AbstractTableModel {

    private static final int COL_NOM = 0;
    private static final int COL_GEN = 1;
    private static final int COL_VAL = 2;
    private static final int COL_CAT = 3;
    private static final int COL_QTD = 4;
    private static final int COL_COR = 5;
    private static final int COL_DE  = 6;
    private static final int COL_ATE = 7;
    
    
    private TooltipCellRender renderer = new TooltipCellRender();
    private List<CalcadosFiltradosMODEL> dados;

    public CalcadosFiltradosTable(List<CalcadosFiltradosMODEL> dados) {
        this.dados = new ArrayList<CalcadosFiltradosMODEL>();
        this.dados = dados;
        
    }
    

    @Override
    public int getRowCount() {
        return dados.size();
    }

    @Override
    public int getColumnCount() {
        return 8;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        CalcadosFiltradosMODEL dado = dados.get(rowIndex);
        if(columnIndex == COL_NOM){
            return new Pair<String, String>(dado.getNome(), dado.getNome());
        }else if(columnIndex == COL_GEN){
            return new Pair<String, String>(dado.getGenero(), dado.getGenero());
        }else if(columnIndex == COL_VAL){
            return new Pair<Double, Double>(dado.getValor(), dado.getValor());
        }else if(columnIndex == COL_CAT){
            return new Pair<String, String>(dado.getCategoria(), dado.getCategoria());
        }else if(columnIndex == COL_QTD){
            return new Pair<Integer, Integer>(dado.getQuantidade(), dado.getQuantidade());
        }else if(columnIndex == COL_COR){
            return new Pair<String, String>(dado.getCor(), dado.getCor());
        }else if(columnIndex == COL_DE){
            return new Pair<Integer, Integer>(dado.getDe(), dado.getDe());
        } else if (columnIndex == COL_ATE) {
            return new Pair<Integer, Integer>(dado.getAte(), dado.getAte());
        }

        return null;
    }

    @Override
    public String getColumnName(int column) {
        String coluna = "";
        switch (column) {
            case COL_NOM:
                coluna = "Nome";
                break;
            case COL_GEN:
                coluna = "Genero";
                break;
            case COL_VAL:
                coluna = "Valor";
                break;
            case COL_CAT:
                coluna = "Categoria";
                break;
            case COL_QTD:
                coluna = "Quantidade";
                break;
            case COL_COR:
                coluna = "Cor";
                break;
            case COL_DE:
                coluna = "De";
                break;
            case COL_ATE:
                coluna = "Até";
                break;
            default:
                throw new IllegalArgumentException("Coluna Inválida");
        }
        return coluna;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if(columnIndex == COL_NOM){
            return String.class;
        }else if(columnIndex == COL_GEN){
            return String.class;
        }else if(columnIndex == COL_VAL){
            return String.class;
        }else if(columnIndex == COL_CAT){
            return String.class;
        }else if(columnIndex == COL_QTD){
            return String.class;
        }else if(columnIndex == COL_COR){
            return String.class;
        }else if(columnIndex == COL_DE){
            return String.class;
        } else if (columnIndex == COL_ATE) {
            return String.class;
        }
        return null;
    }

    public CalcadosFiltradosMODEL get(int row) {
        return dados.get(row);
    }
    
    public List<CalcadosFiltradosMODEL> getAll(){
        return dados;
    }

    public Object get(int rowIndex, int columnIndex) {
        CalcadosFiltradosMODEL atr = dados.get(rowIndex);
        
        if(columnIndex == COL_NOM){
            return atr.getNome();
        }else if(columnIndex == COL_GEN){
            return atr.getGenero();
        }else if(columnIndex == COL_VAL){
            return atr.getValor();
        }else if(columnIndex == COL_CAT){
            return atr.getCategoria();
        }else if(columnIndex == COL_QTD){
            return atr.getQuantidade();
        }else if(columnIndex == COL_COR){
            return atr.getCor();
        }else if(columnIndex == COL_DE){
            return atr.getDe();
        } else if (columnIndex == COL_ATE) {
            return atr.getAte();
        }
        return null;
    }

    // Adiciona o sócio especificado ao modelo
    public void addDado(CalcadosFiltradosMODEL dado) {
        // Adiciona o registro.
        
        this.dados.add(dado);
        // Pega a quantidade de registros e subtrai 1 para
        // achar o último índice. A subtração é necessária
        // porque os índices começam em zero.
        int ultimoIndice = getRowCount() - 1;
        
        // Notifica a mudança.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

//    public int exists(CalcadosFiltradosMODEL dado){
//        int linha = 0;
//        for (CalcadosFiltradosMODEL atr : dados) {
//            if(dado.getCor() == atr.getCor()){
//                if(dado.getNum() == atr.getNum()){
//                    return linha;
//                }
//            }
//            linha++;
//        }
//        linha = -1;
//        return linha;
//    }
    
    public void updateDado(int indiceLinha, CalcadosFiltradosMODEL dado) {
        
        this.dados.set(indiceLinha, dado);
        fireTableRowsUpdated(indiceLinha, indiceLinha);
    }

    // Remove o sócio da linha especificada.
    public void removeDado(int indiceLinha) {
        // Remove o registro.
        
        dados.remove(indiceLinha);

        // Notifica a mudança.
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }
    
    public void removeAll(){
        
        dados.clear();
        fireTableDataChanged();
    }

    private String format(String pattern, Object value) {
        MaskFormatter mask;
        try {
            mask = new MaskFormatter(pattern);
            mask.setValueContainsLiteralCharacters(false);
            return mask.valueToString(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

}
